/* vector:向量容器
 * 底层数据结构：动态开辟的数组，每次以原来空间大小的2倍进行扩容
 * 在容器中，对象的构造、析构、内存的开辟释放都是通过容器的空间配置器allocator完成
 *
 * vector<int> vec
 * 增加：
 * vec.push_back(20);   末尾添加元素 O(1)     导致容器扩容
 * vec.insert(it,20);   it 迭代器指向的位置添加一个元素 O(n) 导致容器扩容
 *
 * 删除：
 * vec.pop_back();      末尾删除元素 O(1)
 * vec.erase(it);       删除it迭代器指向的元素 O(n)
 *
 * 查询：
 * operator[] 下标随机访问vec[5] O(1)
 * iterator迭代器进行遍历
 * find、for_each
 * for_each => 通过iterator来实现的
 *
 * 注意：
 * 对容器进行连续插入或删除操作(insert/erase),一定要更新迭代器，否则第一次insert或者erase完成，迭代器就失效了
 *
 * 常用方法介绍：
 * size()
 * empty()
 * reserve(20):vector预留空间的  只给容器底层开辟指定大小的内存空间，并不会添加新的元素
 * resize(20):扩容用的  不仅给容器底层开辟指定大小的内存空间，还会添加新的元素
 * swap:两个元素进行元素交换
 * */

#include <iostream>
#include <vector>
using namespace std;
int main(){
    vector<int> vec;
    for (int i = 0; i < 20; ++i) {
        vec.push_back(rand()%100+1);
    }
    for (int i = 0; i < vec.size(); ++i) {
        cout<<vec[i]<<" ";
    }
    cout<<endl;

    //将vec容器中所有的偶数全部删除
    auto it2=vec.begin();
    while (it2!=vec.end()){
        if (*it2%2==0)
            it2=vec.erase(it2);
        else
            ++it2;
    }

    //迭代器遍历
    for (auto i = vec.begin(); i !=vec.end() ; ++i) {
        cout<<*i<<" ";
    }
    cout<<endl;

    //给vector中所有的奇数前面都添加一个小于奇数1的偶数  44 45  56 57
    for (auto i = vec.begin(); i !=vec.end(); ++i) {
        if (*i%2!=0){
            i=vec.insert(i,*i-1);
            ++i;
        }
    }
    for (auto i = vec.begin(); i !=vec.end() ; ++i) {
        cout<<*i<<" ";
    }
    cout<<endl;
    return 0;
}
